import os
from PIL import Image
import subprocess

os.environ["PATH"] += r";D:\optipng-7.9.1-win64"


def compress_image(input_path, output_path):
    img = Image.open(input_path)
    optipng_path = r"optipng"
    # optipng_path = r"D:\optipng-7.9.1-win64\optipng.exe"
    if img.format == 'PNG':
        img.save(output_path, optimize=True)
        # 可进一步调用optipng
        subprocess.run([optipng_path, '-o1', output_path])
    elif img.format in ['JPEG', 'JPG']:
        img.save(output_path, quality=100, optimize=True)
        # 可进一步调用jpegoptim
        subprocess.run(['jpegoptim', '--strip-all', output_path])
    else:
        img.save(output_path)  # 其他格式直接保存


# -o0 ~ -o7	优化级别（0~7），数字越大，压缩越彻底（耗时越长）。默认是 -o2。推荐：-o7。
# -strip all	删除所有不必要的元数据（如时间戳、注释、ICC配置文件等）。
# -out output.png	指定输出文件路径（不加则覆盖原文件）。
# -clobber	允许覆盖现有文件（有些系统默认不允许）。
# -quiet	安静模式，不输出任何日志信息。
# -preserve	保留原文件的时间戳信息。
# -log file.txt	把日志输出到指定文件。
# -dir output_dir	把优化后的图片保存到指定目录下。
# -fix	修复损坏的 PNG 文件结构（如果存在 CRC 错误等）。
# -nb	不进行备份文件生成。
# -nc	不创建新文件，直接覆盖原文件。


def batch_compress(folder_path, output_folder):
    os.makedirs(output_folder, exist_ok=True)
    for root, dirs, files in os.walk(folder_path):
        for f in files:
            if f.lower().endswith(('.png', '.jpg', '.jpeg')):
                input_file = os.path.join(root, f)
                rel_path = os.path.relpath(root, folder_path)
                out_dir = os.path.join(output_folder, rel_path)
                os.makedirs(out_dir, exist_ok=True)
                output_file = os.path.join(out_dir, f)
                compress_image(input_file, output_file)
                print(f'Compressed: {input_file} -> {output_file}')


# 使用示例
# batch_compress('input_images', 'output_images')

compress_image("002.png", "003.png")
# 速度慢，压缩效果一般。没有AI辅助还是有局限
